// MAIN ---- Created with 3Dmigoto v1.3.16 on Wed Mar 23 17:15:19 2022

cbuffer _Globals : register(b0)
{
  float4 g_vDefSettings : packoffset(c0);
  float4 ambient : packoffset(c1);
  float4 g_vDefLightDir : packoffset(c2);
  float4 g_vDefLightColor : packoffset(c3);
  float4 g_vDefSpecColor : packoffset(c4);
  int4 g_vnStartCascadeInstance : packoffset(c5) = {0,0,0,0};
  float4 g_vScreenDepthRect : packoffset(c6);
  float4x4 g_mCloudsShadowsSpace : packoffset(c7) = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  float4 g_vCloudsShadowDesc : packoffset(c11) = {0,0,0,0};
  float4 g_vTexTransform : packoffset(c12);
  float4 g_vPerspZ : packoffset(c13);
  float4 g_vCamPos : packoffset(c14);
  float4 g_vPixelOffset : packoffset(c15);
  float4 g_vCamSetup : packoffset(c16) = {0,0,1,1};
  float4x4 g_mIView : packoffset(c17);
  float4x4 g_mView : packoffset(c21);
  float4x4 g_mCascadeLightSpace : packoffset(c25);
  float4 g_vCascadeUVTransform : packoffset(c29);
  float4 g_vCascadeZTransform : packoffset(c30);
  float4 g_vNoiseSetup : packoffset(c31);
}

cbuffer CBLightSettings : register(b1)
{

  struct
  {
    float4 vLightsListSettings2;
    float4 vShadowLODYPos;
    float4 vShadowLODXSZ;
    float4 vShadowLODYSZ;
    float4 vShadowTexRes;
  } g_LightListSettings : packoffset(c0);

  float4 g_avLODMask[4] : packoffset(c5);
  float4 g_avRot[6] : packoffset(c9);
}

cbuffer CBShadSettings : register(b2)
{

  struct
  {
    float4x4 mLightSpace;
    float4 vViewProjW;
    float4 vSmoothOffs;
    float4 vShadowsDesc;
    float4 avCascadeZ[2];
    float4 avUVTransform[8];
    float4 avZTransformZF[8];
  } g_ShadSettings : packoffset(c0);

}

cbuffer CBFog : register(b3)
{

  struct
  {
    float4 vDesc;
    float4 vFogLayerPlane;
    float4 vFogLayerColor;
    float4 vFogLayerSettings;
    float4 vFogColor;
    float4 vFogDistance;
    float4 vSunColor;
    float4 vAmbient;
  } g_FogDesc : packoffset(c0);

}

SamplerState AmbientSampler_s : register(s1);
SamplerState SSAOSampler_s : register(s3);
SamplerState CloudsShadowsSampler_s : register(s4);
SamplerState SkyLerpSampler_s : register(s5);
SamplerState LerpSampler_s : register(s6);
SamplerComparisonState LightsShadowsSampler_s : register(s0);
SamplerComparisonState shadowSamplerF_s : register(s2);
TextureCube<float4> AmbientSampler : register(t0);
Texture2D<float4> SSAOSampler : register(t1);
Buffer<float4> g_bufLightsInfo : register(t2);
Texture2D<float4> g_tLightsShadows : register(t3);
Texture3D<uint2> g_tLightsList : register(t4);
Texture2D<float4> g_tDepthTexture : register(t5);
Texture2D<float4> g_tCloudsShadowsTexture : register(t6);
Texture2DArray<float4> g_tSky : register(t7);
Texture2D<float4> g_tms1Albedo : register(t8);
Texture2D<float4> g_tms1Normals : register(t9);
Texture2D<float4> g_tms1SpecRef : register(t10);
Texture2D<float4> g_tms1SelfLight : register(t11);
Texture2D<float4> g_tms1Depth : register(t12);
Texture2D<float4> g_tWaterReflection : register(t13);
TextureCube<float4> g_tReflection : register(t14);


// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
  float4 v0 : SV_Position0,
  float2 v1 : TEXCOORD0,
  float2 w1 : TEXCOORD1,
  float2 v2 : TEXCOORD2,
  out float4 o0 : SV_Target0)
{
  float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26; //r25+26
  uint4 bitmask, uiDest;
  float4 fDest;

  r0.xy = (int2)v1.xy;
  r0.zw = float2(0,0);
  r1.xyzw = g_tms1Albedo.Load(r0.xyw).xyzw; /// r1.w CLEAR

  r2.xyz = g_tms1Normals.Load(r0.xyw).xyz;
  //o0.xyz = r2.xxxx* r2.yyyy  ;
  /////////////
  r2.w = dot(r2.xyz, float3(1,1,1));
  r2.w = cmp(0 >= r2.w);
  r2.xyz = r2.xyz * float3(2,2,2) + float3(-1,-1,-1);
  r3.x = dot(r2.xyz, r2.xyz);
  r3.y = rsqrt(r3.x);
  r2.xyz = r3.yyy * r2.xyz;
  r3.y = g_tms1Depth.Load(r0.xyw).x;
  r3.y = -g_vPerspZ.z + r3.y;
  r4.z = g_vPerspZ.w / r3.y;
  r4.xy = v2.xy * r4.zz;
  r4.w = 1;
  r5.x = dot(r4.xyzw, g_mIView._m00_m10_m20_m30);
  r5.y = dot(r4.xyzw, g_mIView._m01_m11_m21_m31);
  r5.z = dot(r4.xyzw, g_mIView._m02_m12_m22_m32);
  r3.yzw = g_vCamPos.xyz + -r5.xyz;
  r4.x = dot(r3.yzw, r3.yzw);
  r4.x = rsqrt(r4.x);
  r6.xyz = r4.xxx * r3.yzw;
  r7.xyz = AmbientSampler.Sample(AmbientSampler_s, r2.xyz).xyz; /////////////////////AMBIENT SHIT
  r4.yw = w1.xy * g_vScreenDepthRect.zw + g_vScreenDepthRect.xy;
  r4.y = SSAOSampler.Sample(SSAOSampler_s, r4.yw).y;
  r4.w = dot(-r6.xyz, r2.xyz);
  r4.w = r4.w + r4.w;
  r8.xyz = r2.xyz * -r4.www + -r6.xyz;
  r8.w = -r8.y;
  r9.xyz = r3.yzw * r4.xxx + r8.xwz;
  r10.x = dot(r9.xyz, g_mView._m00_m10_m20);
  r4.w = dot(r9.xyz, g_mView._m01_m11_m21);
  r10.y = -r4.w;
  r4.w = saturate(r6.y);
  r4.w = 1 + -r4.w;
  r4.w = log2(r4.w);
  r4.w = 16 * r4.w;
  r4.w = exp2(r4.w);
  r4.w = 1 + -r4.w;
  r9.xy = r10.xy * r4.ww;
  r9.xy = r9.xy * float2(0.125,0.125) + w1.xy;
  r9.xyz = g_tWaterReflection.Sample(LerpSampler_s, r9.xy).xyz;
   //////////////////////////////////////////////////////////////////////////////////// r1.w USABLE
  if (r2.w != 0) {
    o0.xyzw = r1.xyzw;
  } else {
    r1.w = cmp(r3.x < 0.970000029);
    if (r1.w != 0) {
      r1.w = sqrt(r3.x);
      r1.w = -0.25 + r1.w;
      r1.w = saturate(1.33333337 * r1.w);
    } else {
      r1.w = 1;
    }
    r10.xyzw = g_tms1SelfLight.Load(r0.xyw).xyzw;
    r0.xyzw = g_tms1SpecRef.Load(r0.xyz).zxyw;//////////////////////////////////////// SPEC REF
    r25.w = r0.y;
   // o0.xyz = r0.yyyy;
/////////////////////////
    r5.w = 1;
    r11.x = dot(r5.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r2.w = dot(r5.xyzw, g_mCloudsShadowsSpace._m01_m11_m21_m31);
    r11.y = dot(r5.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r2.w = -g_vCloudsShadowDesc.x + r2.w;
    r2.w = -r2.w * g_vCloudsShadowDesc.y + 1;
    r12.xyz = -g_vCamPos.xyz + r5.xyz;
    r3.x = dot(r12.xyz, r12.xyz);
    r3.x = sqrt(r3.x);
    r3.x = 0.0500000007 * r3.x;
    r4.w = dot(r2.xyz, r12.xyz);
    r13.x = g_vPixelOffset.x + v2.x;
    r13.y = v2.y;
    r13.zw = float2(1,1);
    r14.x = dot(r13.xyz, g_mIView._m00_m10_m20);
    r14.y = dot(r13.xyz, g_mIView._m01_m11_m21);
    r14.z = dot(r13.xyz, g_mIView._m02_m12_m22);
    r6.w = dot(r14.xyz, r14.xyz);
    r6.w = rsqrt(r6.w);
    r13.xyz = r14.xyz * r6.www;
    r14.xyz = r13.xyz * r4.www;
    r6.w = dot(r2.xyz, r13.xyz);
    r13.xyz = r14.xyz / r6.www;
    r13.xyz = r13.xyz + -r12.xyz;
    r6.w = dot(r13.xyz, r13.xyz);
    r3.x = r3.x * r3.x;
    r7.w = cmp(r3.x < r6.w);
    if (r7.w != 0) {
      r6.w = r3.x / r6.w;
      r6.w = sqrt(r6.w);
      r13.xyz = r13.xyz * r6.www;
    }
    r13.xyz = r13.xyz + r5.xyz;
    r14.x = dot(r13.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r14.y = dot(r13.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r13.x = v2.x;
    r13.y = g_vPixelOffset.y + v2.y;
    r13.z = 1;
    r15.x = dot(r13.xyz, g_mIView._m00_m10_m20);
    r15.y = dot(r13.xyz, g_mIView._m01_m11_m21);
    r15.z = dot(r13.xyz, g_mIView._m02_m12_m22);
    r6.w = dot(r15.xyz, r15.xyz);
    r6.w = rsqrt(r6.w);
    r13.xyz = r15.xyz * r6.www;
    r15.xyz = r13.xyz * r4.www;
    r4.w = dot(r2.xyz, r13.xyz);
    r13.xyz = r15.xyz / r4.www;
    r12.xyz = r13.xyz + -r12.xyz;
    r4.w = dot(r12.xyz, r12.xyz);
    r6.w = cmp(r3.x < r4.w);
    if (r6.w != 0) {
      r3.x = r3.x / r4.w;
      r3.x = sqrt(r3.x);
      r12.xyz = r12.xyz * r3.xxx;
    }
    r12.xyz = r12.xyz + r5.xyz;
    r12.w = 1;
    r13.x = dot(r12.xyzw, g_mCloudsShadowsSpace._m00_m10_m20_m30);
    r13.y = dot(r12.xyzw, g_mCloudsShadowsSpace._m02_m12_m22_m32);
    r11.zw = r14.xy + -r11.xy;
    r12.xy = r13.xy + -r11.xy;
    r11.xyz = g_tCloudsShadowsTexture.SampleGrad(CloudsShadowsSampler_s, r11.xy, r11.zwz, r12.xyx).yzw;
    r3.x = -r11.y + r2.w;
    r3.x = saturate(50 * r3.x);
    r4.w = -1 + r11.x;
    r4.w = r3.x * r4.w + 1;
    r6.w = r11.y + r11.z;
    r2.w = saturate(r6.w + -r2.w);
    r2.w = r3.x * r2.w;
    r1.w = r4.w * r1.w; //////////////////////////////////////////////////////////////////////// CLOUD SHADOWS
  ///      o0.xyz = r1.wwww;
    r11.xy = cmp(float2(0,0) < r0.xw);
   /// o0.xyz = r11.yyyy;
    r12.xy = cmp(float2(0.100000001,0.0500000007) >= r0.ww);
    r3.x = (int)r11.x | (int)r12.x;
    if (r3.x != 0) {
      r13.x = dot(r5.xyzw, g_ShadSettings.mLightSpace._m00_m10_m20_m30);
      r13.y = dot(r5.xyzw, g_ShadSettings.mLightSpace._m01_m11_m21_m31);
      r3.x = dot(r5.xyzw, g_ShadSettings.mLightSpace._m02_m12_m22_m32);
      r6.w = dot(g_ShadSettings.vViewProjW.xyzw, r5.xyzw);
      r14.xyzw = cmp(g_ShadSettings.avCascadeZ[0].xyzw < r6.wwww);
      r14.xyzw = r14.xyzw ? float4(1,1,1,1) : 0;
      r7.w = dot(float4(1,1,1,1), r14.xyzw);
      r14.xyzw = cmp(g_ShadSettings.avCascadeZ[1].xyzw < r6.wwww);
      r14.xyzw = r14.xyzw ? float4(1,1,1,1) : 0;
      r8.w = dot(float4(1,1,1,1), r14.xyzw);
      r7.w = r8.w + r7.w;
      r8.w = (uint)r7.w;
      r12.xz = r13.xy * g_ShadSettings.avUVTransform[r8.w].zw + g_ShadSettings.avUVTransform[r8.w].xy;
      r9.w = r3.x * g_ShadSettings.avZTransformZF[r8.w].y + g_ShadSettings.avZTransformZF[r8.w].x;
      r11.w = g_ShadSettings.vShadowsDesc.z * r6.w;
      r14.xyzw = cmp(g_ShadSettings.avCascadeZ[0].xyzw < r11.wwww);
      r14.xyzw = r14.xyzw ? float4(1,1,1,1) : 0;
      r12.w = dot(float4(1,1,1,1), r14.xyzw);
      r14.xyzw = cmp(g_ShadSettings.avCascadeZ[1].xyzw < r11.wwww);
      r14.xyzw = r14.xyzw ? float4(1,1,1,1) : 0;
      r11.w = dot(float4(1,1,1,1), r14.xyzw);
      r11.w = r12.w + r11.w;
      r7.w = cmp(r7.w < r11.w);
      if (r7.w != 0) {
        r7.w = (uint)r11.w;
        r13.xy = r13.xy * g_ShadSettings.avUVTransform[r7.w].zw + g_ShadSettings.avUVTransform[r7.w].xy;
        r3.x = r3.x * g_ShadSettings.avZTransformZF[r7.w].y + g_ShadSettings.avZTransformZF[r7.w].x;
        r6.w = -g_ShadSettings.avZTransformZF[r8.w].w * g_ShadSettings.vShadowsDesc.w + r6.w;
        r7.w = -g_ShadSettings.avZTransformZF[r8.w].w * g_ShadSettings.vShadowsDesc.w + g_ShadSettings.avZTransformZF[r8.w].w;
        r6.w = r6.w / r7.w;
      } else {
        r13.xy = r12.xz;
        r3.x = r9.w;
        r6.w = 0;
      }
      r7.w = cmp(0 < r6.w);
      r8.w = 0;
      r11.w = -1;
      while (true) {
        r12.w = cmp(1 < (int)r11.w);
        if (r12.w != 0) break;
        r14.y = (int)r11.w;
        r12.w = r8.w;
        r13.z = -1;
        while (true) {
          r13.w = cmp(1 < (int)r13.z);
          if (r13.w != 0) break;
          r14.x = (int)r13.z;
          r14.zw = r14.xy * g_ShadSettings.vSmoothOffs.xy + r12.xz;
          r13.w = g_tDepthTexture.SampleCmpLevelZero(shadowSamplerF_s, r14.zw, r9.w).x;
          if (r7.w != 0) {
            r14.xz = r14.xy * g_ShadSettings.vSmoothOffs.xy + r13.xy;
            r14.x = g_tDepthTexture.SampleCmpLevelZero(shadowSamplerF_s, r14.xz, r3.x).x;
            r14.x = r14.x + -r13.w;
            r13.w = r6.w * r14.x + r13.w;
          }
          r12.w = r13.w + r12.w;
          r13.z = (int)r13.z + 1;
        }
        r8.w = r12.w;
        r11.w = (int)r11.w + 1;
      }
      r3.x = 0.111111112 * r8.w;
      r6.w = -g_ShadSettings.vShadowsDesc.x + r4.z;
      r6.w = saturate(g_ShadSettings.vShadowsDesc.y * r6.w);
      r7.w = -r8.w * 0.111111112 + 1;
      r3.x = r6.w * r7.w + r3.x;
      r1.w = r3.x * r1.w;
    }
    r3.x = cmp(0.5 < ambient.w);
    if (r3.x != 0) {
      r3.x = max(ambient.y, ambient.z);
      r3.x = max(ambient.x, r3.x);
      r6.w = max(r7.y, r7.z);
      r6.w = max(r7.x, r6.w);
      r7.w = cmp(r6.w < r3.x);
      if (r7.w != 0) {
        r3.x = r3.x / r6.w;
        r7.xyz = r7.xyz * r3.xxx;
      }
    } else {
      r7.xyz = ambient.xyz;
    }
    r7.xyz = r11.yyy ? ambient.xyz : r7.xyz; //////////////////////////////////////// FUCK THIS LMAO

    r3.x = r11.y ? r12.y : 0;
    r12.xy = cmp(r0.xw == float2(0,0));
    if (r12.x != 0) {
      r6.w = 1 + -r0.w;
      r6.w = saturate(1.11111116 * r6.w);
      r7.w = 1 + -r6.w;
      r7.xyz = g_vDefLightColor.xyz * r7.www + r7.xyz;
      r12.xzw = g_vDefLightColor.xyz * r6.www;
    } else {
      r12.xzw = g_vDefLightColor.xyz;
    }
    r6.w = dot(r7.xyz, float3(0.166500002,0.166500002,0.166500002));
    r2.w = r11.z * r2.w;
    r13.xyz = r6.www + -r7.xyz;
    r7.xyz = r2.www * r13.xyz + r7.xyz;
    r2.w = dot(ambient.xyz, float3(0.333000004,0.333000004,0.333000004));
    r2.w = -0.5 + r2.w;
    r2.w = saturate(-r2.w * 5 + 1);
    r2.w = r2.w * r10.w;
    r6.w = 255 * r0.z;
    r0.z = r0.z * 255 + 0.5;
    r0.z = floor(r0.z);
    r7.w = 0.03125 * r0.z;
    r7.w = floor(r7.w);
    r0.z = -r7.w * 32 + r0.z;
    r0.z = 0.0322580636 * r0.z;
    r0.z = r0.z * r0.z;
    r13.x = 250 * r0.z;
    r0.z = r13.x * r7.w;
    r13.y = 0.142857149 * r0.z;
    r11.zw = r12.yy ? r13.xy : r6.ww;
    r13.xy = g_LightListSettings.vLightsListSettings2.xy * w1.xy;
    r13.yz = (int2)r13.xy;
    r13.w = 0;
    r14.xy = g_tLightsList.Load(r13.yzww).xy;
    r0.z = min(17, (uint)r14.y);
    r6.w = cmp(0.5 < g_LightListSettings.vLightsListSettings2.w);
    r14.yzw = float3(0,0,0);
    r15.xyz = float3(0,0,0);
    r7.w = 1;
    r13.x = 0;
    r8.w = r14.x;
    while (true) {
      r9.w = cmp((int)r7.w >= (int)r0.z);
      if (r9.w != 0) break;
      if (r7.w != 0) {
        r13.x = (int)r13.x + 1;
        r8.w = g_tLightsList.Load(r13.yzxw).x;
      }
      r9.w = (uint)r8.w << 3;
      r16.xyzw = g_bufLightsInfo.Load(r9.w).xyzw;
      bitmask.w = ((~(-1 << 29)) << 3) & 0xffffffff;  r9.w = (((uint)r8.w << 3) & bitmask.w) | ((uint)1 & ~bitmask.w);
      r17.xyzw = g_bufLightsInfo.Load(r9.w).xywz;
      r18.xy = cmp(r17.xy >= float2(100,100));
      if (r18.x != 0) {
        r17.x = -100 + r17.x;
      }
      if (r18.y != 0) {
        r17.y = -100 + r17.y;
      }
      r10.w = cmp(1 < r16.w);
      if (r10.w != 0) {
        r19.xyz = r16.xyz + -r5.xyz;
        r10.w = dot(r19.xyz, r19.xyz);
        r12.y = sqrt(r10.w);
        r19.xyz = r19.xyz / r12.yyy;
        r10.w = r10.w * r17.z + 1;
        r10.w = 1 / r10.w;
        r10.w = -0.100000001 + r10.w;
        r10.w = saturate(1.11111116 * r10.w);
        r12.y = (int)r9.w + 1;
        r15.w = cmp(2 < r16.w);
        if (r15.w != 0) {
          r20.xyzw = g_bufLightsInfo.Load(r12.y).xyzw;
          r16.w = -3 + r16.w;
          r18.z = dot(r19.xyz, r20.xyz);
          r18.w = 1 + -abs(r18.z);
          r18.w = sqrt(r18.w);
          r19.w = abs(r18.z) * -0.0187292993 + 0.0742610022;
          r19.w = r19.w * abs(r18.z) + -0.212114394;
          r19.w = r19.w * abs(r18.z) + 1.57072878;
          r20.x = r19.w * r18.w;
          r20.x = r20.x * -2 + 3.14159274;
          r18.z = cmp(r18.z < -r18.z);
          r18.z = r18.z ? r20.x : 0;
          r18.z = r19.w * r18.w + r18.z;
          r18.w = cmp(r18.z < r16.w);
          if (r18.w != 0) {
            r18.w = frac(r20.w);
            r16.w = r18.z / r16.w;
            r16.w = r16.w + -r18.w;
            r18.z = 1 + -r18.w;
            r16.w = saturate(r16.w / r18.z);
            r16.w = 1 + -r16.w;
          } else {
            r16.w = 0;
          }
          r10.w = r16.w * r10.w;
          r16.w = cmp(0 < r10.w);
          r18.z = cmp(r20.w >= 1);
          r16.w = r16.w ? r18.z : 0;
          if (r16.w != 0) {
            r16.w = (int)r20.w;
            r16.w = (int)r16.w + -1;
          } else {
            r16.w = -1;
          }
          r20.xyz = r5.xyz;
        } else {
          r18.z = cmp(0 < r10.w);
          r18.y = r18.z ? r18.y : 0;
          if (r18.y != 0) {
            r12.y = g_bufLightsInfo.Load(r12.y).w;
            r18.y = cmp(r12.y >= 1);
            if (r18.y != 0) {
              r12.y = (int)r12.y;
              r12.y = (int)r12.y + -1;
              r18.yzw = -r16.xyz + r5.xyz;
              r21.xy = cmp(abs(r18.yw) < r18.zz);
              r19.w = r21.y ? r21.x : 0;
              if (r19.w != 0) {
                r19.w = 4;
              } else {
                r21.xy = cmp(r18.zz < -abs(r18.yw));
                r20.w = r21.y ? r21.x : 0;
                if (r20.w != 0) {
                  r19.w = 5;
                } else {
                  r20.w = cmp(abs(r18.y) < r18.w);
                  if (r20.w != 0) {
                    r19.w = 0;
                  } else {
                    r20.w = cmp(r18.w < -abs(r18.y));
                    if (r20.w != 0) {
                      r19.w = 2;
                    } else {
                      r20.w = cmp(r18.y >= 0);
                      if (r20.w != 0) {
                        r19.w = 1;
                      } else {
                        r19.w = 3;
                      }
                    }
                  }
                }
              }
              r20.w = cmp((uint)r19.w < 4);
              if (r20.w != 0) {
                r21.x = dot(r18.yw, g_avRot[r19.w].xy);
                r21.z = dot(r18.yw, g_avRot[r19.w].zw);
                r21.y = r18.z;
              } else {
                r21.y = dot(r18.zw, g_avRot[r19.w].xy);
                r21.z = dot(r18.zw, g_avRot[r19.w].zw);
                r21.x = r18.y;
              }
              r20.xyz = r21.xyz + r16.xyz;
              r16.w = (int)r12.y + (int)r19.w;
            } else {
              r16.w = -1;
              r20.xyz = r5.xyz;
            }
          } else {
            r16.w = -1;
            r20.xyz = r5.xyz;
          }
        }
        r12.y = cmp((int)r16.w >= 0);
        if (r12.y != 0) {
          r9.w = (int)r9.w + 3;
          r21.xyzw = g_bufLightsInfo.Load(r9.w).xyzw;
          r9.w = (int)r9.w | 5;
          r22.xyzw = g_bufLightsInfo.Load(r9.w).xyzw;
          r9.w = (int)r9.w + 1;
          r23.xyzw = g_bufLightsInfo.Load(r9.w).xyzw;
          r9.w = (int)r9.w | 7;
          r24.xyzw = g_bufLightsInfo.Load(r9.w).xyzw;
          r22.xyzw = r22.xyzw * r20.yyyy;
          r21.xyzw = r20.xxxx * r21.xyzw + r22.xyzw;
          r20.xyzw = r20.zzzz * r23.xyzw + r21.xyzw;
          r20.xyzw = r20.xyzw + r24.xyzw;
          r18.yzw = r20.xyz / r20.www;
          r20.xy = cmp(float2(1,1) < abs(r18.yz));
          r9.w = (int)r20.y | (int)r20.x;
          if (r9.w != 0) {
            r12.y = 0;
          }
          if (r9.w == 0) {
            r9.w = r18.y * 0.5 + 0.5;
            r18.y = -r18.z * 0.5 + 0.5;
            r18.z = (uint)r16.w >> 5;
            r16.w = (int)r16.w & 31;
            r19.w = dot(g_LightListSettings.vShadowLODXSZ.xyzw, g_avLODMask[r18.z].xyzw);
            if (r15.w == 0) {
              r20.x = g_LightListSettings.vShadowTexRes.x * r19.w;
              r20.x = 0.5 / r20.x;
              r20.y = 1 + -r20.x;
              r20.z = max(r20.x, r9.w);
              r9.w = min(r20.z, r20.y);
              r20.x = max(r20.x, r18.y);
              r18.y = min(r20.x, r20.y);
            }
            r16.w = (uint)r16.w;
            r9.w = r16.w + r9.w;
            r20.x = r9.w * r19.w;
            r9.w = dot(g_LightListSettings.vShadowLODYPos.xyzw, g_avLODMask[r18.z].xyzw);
            r16.w = dot(r18.yy, r19.ww);
            r20.y = r16.w + r9.w;
            r12.y = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r20.xy, r18.w).x;
            r9.w = r6.w ? r15.w : 0;
            if (r9.w != 0) {
              r21.yz = -g_LightListSettings.vShadowTexRes.zw + r20.xy;
              r9.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.yz, r18.w).x;
              r9.w = r12.y + r9.w;
              r21.xw = g_LightListSettings.vShadowTexRes.zw + r20.xy;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.xz, r18.w).x;
              r9.w = r15.w + r9.w;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.yw, r18.w).x;
              r9.w = r15.w + r9.w;
              r15.w = g_tLightsShadows.SampleCmpLevelZero(LightsShadowsSampler_s, r21.xw, r18.w).x;
              r9.w = r15.w + r9.w;
              r12.y = 0.200000003 * r9.w;
            }
          }
          r10.w = r12.y * r10.w;
        }
        r16.xyz = r19.xyz;
      } else {
        r16.xyz = -r16.xyz;
        r10.w = 1;
      }
      r9.w = cmp(0 < r10.w);
      if (r9.w != 0) {
        r9.w = ~(int)r18.x;
        r12.y = dot(r16.xyz, r2.xyz);
        r15.w = cmp(0 < r12.y);
        if (r15.w != 0) {
          r17.z = r17.w;
          r18.xyz = r17.xyz * r12.yyy;
          r18.xyz = r18.xyz * r10.www;
        } else {
          r18.xyz = float3(0,0,0);
        }
        r9.w = r9.w ? r15.w : 0;
        if (r9.w != 0) {
          r16.xyz = r3.yzw * r4.xxx + r16.xyz;
          r16.xyz = float3(0.5,0.5,0.5) * r16.xyz;
          r9.w = dot(r16.xyz, r16.xyz);
          r9.w = rsqrt(r9.w);
          r16.xyz = r16.xyz * r9.www;
          r9.w = dot(r16.xyz, r2.xyz);
          r15.w = cmp(0.00400000019 < r9.w);
          if (r15.w != 0) {
            r9.w = log2(r9.w);
            r9.w = r11.z * r9.w;
            r9.w = exp2(r9.w);
            r10.w = sqrt(r10.w);
            r9.w = r10.w * r9.w;
            r16.xyz = r17.xyw * r9.www;
            r16.xyz = r16.xyz * r0.yyy;
            r9.w = saturate(10 * r12.y);
            r16.xyz = r16.xyz * r9.www;
          } else {
            r16.xyz = float3(0,0,0);
          }
        } else {
          r16.xyz = float3(0,0,0);
        }
        r14.yzw = r18.xyz + r14.yzw;
        r15.xyz = r16.xyz + r15.xyz;
      }
      r7.w = (int)r7.w + 1;
    }
    r0.z = dot(g_vDefLightDir.xyz, r2.xyz);
    if (r3.x != 0) {
      r6.w = cmp(-r0.z < 0);
      if (r6.w != 0) {
        r6.w = (int)r3.x & 0x3f800000;
        r6.x = dot(r6.xyz, r2.xyz);
        r6.x = r6.x * r6.w;
        r0.z = r6.x * r0.z;
      } else {
        r0.z = -r0.z;
      }
      r6.x = 1 + -r0.z;
      r3.x = r3.x ? 0.5 : 1;
      r0.z = -r6.x * r3.x + 1;
    } else {
      r0.z = -r0.z;
    }
    r3.x = saturate(r0.z);
    r6.xyz = r12.xzw * r3.xxx;
    r3.xyz = r3.yzw * r4.xxx + -g_vDefLightDir.xyz;
    r3.xyz = float3(0.5,0.5,0.5) * r3.xyz;
    r3.w = dot(r3.xyz, r3.xyz);
    r3.w = rsqrt(r3.w);
    r3.xyz = r3.xyz * r3.www;
    r2.x = dot(r3.xyz, r2.xyz);
    r2.x = max(0, r2.x);
    r2.y = cmp(0.00400000019 < r2.x);
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    ////////////////////////////////////////////////////// SPECULAR
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    r25.y = r25.w * r25.w;             /// UE style spec to roughness approx
    r25.x = r25.y * 1024;               /// kinda jank
    r25.w = saturate(r25.y * 4.0);              /// will need to tweak some outputs manually
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    if (r2.y != 0) {
      r2.x = log2(r2.x);
             // r2.xy = r11.zw * r2.xx; /// orig
                r2.xy = r25.xx * r2.xx; /// exponent from text
      r2.xy = exp2(r2.xy);
             // r2.x = dot(r2.xy, float2(0.5,0.5)); ????
             //r2.xyz = g_vDefSpecColor.xyz * r2.xxx; // orig
                r2.xyz = g_FogDesc.vSunColor.xyz * r2.xxx; // using suncolor for consistency not sure if defspec is always the same
             // r2.xyz = r2.xyz * r0.yyy;   /// orig
                r2.xyz = r2.xyz * r25.www;  /// power
             // r0.y = saturate(10 * r0.z); /// this looks redunant check later
             // r2.xyz = r2.xyz * r0.yyy;
    } else {
      r2.xyz = float3(0,0,0);
    }
 //   o0.xyz = r2.xyz;
    r3.xyz = r14.yzw + r10.xyz;
    r0.y = r4.z * 0.00666666683 + -0.75;
    r0.y = saturate(4 * r0.y);
    r0.z = 1 + -r4.y;
    r0.y = r0.y * r0.z + r4.y;
    r0.z = r0.y * r0.y;
    r0.y = -r0.y * r0.y + r0.y;
    r0.y = r4.w * r0.y + r0.z;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////// fucking hack
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
            r25.xyz = g_tReflection.SampleLevel(LerpSampler_s,r8.xyz, 8).xyz; ///   sampling cube for ambient
            r25.xyz = r25.xyz * 1.6666666;                                    ///   multi to brighten

    r3.xyz = r6.xyz * r1.www + r3.xyz;          /// orig /// main direct light setup

    r3.xyz = r0.yyy * r7.xyz + r3.xyz;        /// orig /// r0.y = ssao
       //     r3.xyz = r0.yyy * r25.xyz + r3.xyz;                               ///   cube for ambient

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////// end hacky shit
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    r4.xyz = float3(0.400000006,1,0.800000012) * r2.www; //// ambient shit

    r3.xyz = max(r4.xyz, r3.xyz);

    r4.xyz = r3.xyz * r1.xyz; //// light diff x albedo
    if (r11.x != 0) {
      r0.y = cmp(r0.w < 1);
      if (r0.y != 0) {
        r6.xyz = g_tReflection.SampleLevel(LerpSampler_s, r8.xyz, 3).xyz;
      } else {
        r6.xyz = float3(0,0,0);
      }
      if (r11.y != 0) {
        r7.xyz = r9.xyz + -r6.xyz;
        r6.xyz = r0.www * r7.xyz + r6.xyz;
      }
    } else {
      r6.xyz = float3(0,0,0);
      r0.x = 0;
    }
//////////////////////////////
//r25.w = r25.w * r25.w;

//r25.xyz = g_tReflection.SampleLevel(LerpSampler_s, r8.xyz, 0).xyz;
//  r6.xyz = r25.xyz * r25.wwww;

////////////////////////////// LIGHTING OUTPUT BUILDING
//o0.xyz = r4.xyz;
    r0.yzw = -r3.xyz * r1.xyz + r6.xyz;
    r0.xyz = r0.xxx * r0.yzw + r4.xyz;

    r1.xyz = r2.xyz * r1.www + r15.xyz; ///// r2 spec r1w shad r15 dp something

    r0.xyz = r1.xyz + r0.xyz;


    r0.w = dot(r5.xyz, r5.xyz);
    r0.w = sqrt(r0.w);
    r0.w = g_FogDesc.vFogDistance.x * r0.w;
    r0.w = min(1, r0.w);
    r1.x = dot(r5.xyzw, g_FogDesc.vFogLayerPlane.xyzw);
    r1.y = cmp(g_FogDesc.vDesc.z >= 0);
    if (r1.y != 0) {
      r1.z = cmp(r1.x < -g_FogDesc.vFogLayerSettings.y);
      if (r1.z != 0) {
        r1.x = -g_FogDesc.vFogLayerSettings.y;
      }
      r1.z = cmp(r1.x < 0);
      if (r1.z != 0) {
        r1.z = dot(-r5.xyz, -r5.xyz);
        r1.z = rsqrt(r1.z);
        r2.xyz = -r5.xyz * r1.zzz;
        r1.z = dot(g_FogDesc.vFogLayerPlane.xyz, r2.xyz);
        r1.w = cmp(0 < r1.z);
        if (r1.w != 0) {
          r1.z = 1 / r1.z;
          r2.z = -r1.x;
          r1.w = g_FogDesc.vDesc.z + r2.z;
          r2.w = g_FogDesc.vDesc.z * r1.z;
          r1.z = r1.w * r1.z + -r2.w;
          r1.w = r1.x * r1.x;
          r1.z = r1.z * r1.z + -r1.w;
          r2.y = sqrt(abs(r1.z));
        } else {
          r2.yz = float2(0,0);
        }
      } else {
        r2.yz = float2(0,0);
      }
      r2.x = 0;
      r1.z = 0;
    } else {
      r1.w = dot(-r5.xyz, -r5.xyz);
      r1.w = rsqrt(r1.w);
      r3.xyz = -r5.xyz * r1.www;
      r1.w = dot(g_FogDesc.vFogLayerPlane.xyz, r3.xyz);
      r2.w = cmp(0 < abs(r1.w));
      if (r2.w != 0) {
        r1.w = -g_FogDesc.vDesc.z / abs(r1.w);
        r2.w = cmp(r1.x >= 0);
        if (r2.w != 0) {
          r2.w = g_FogDesc.vDesc.z * g_FogDesc.vDesc.z;
          r2.w = r1.w * r1.w + -r2.w;
          r2.y = sqrt(abs(r2.w));
          r2.z = -g_FogDesc.vDesc.z;
          r1.z = 0;
        } else {
          r2.w = dot(-r5.xyz, -r5.xyz);
          r2.w = sqrt(r2.w);
          r3.x = cmp(r3.y < 0);
          if (r3.x != 0) {
            r3.x = g_FogDesc.vDesc.z * g_FogDesc.vDesc.z;
            r3.x = r1.w * r1.w + -r3.x;
            r2.y = sqrt(abs(r3.x));
            r3.x = -r2.w + r1.w;
            r3.x = r3.x * r2.y;
            r1.z = r3.x / r1.w;
            r2.z = -g_FogDesc.vDesc.z;
          } else {
            r2.z = -r1.x;
            r2.w = r2.w + r1.w;
            r1.x = r1.x * r1.x;
            r1.x = r2.w * r2.w + -r1.x;
            r2.y = sqrt(abs(r1.x));
            r1.x = r2.y * r1.w;
            r1.z = r1.x / r2.w;
          }
        }
        r2.x = 0;
      } else {
        r1.x = dot(-r5.xyz, -r5.xyz);
        r2.y = sqrt(r1.x);
        r2.x = -g_FogDesc.vDesc.z;
        r2.z = 9.99999975e-005;
        r1.z = 0;
      }
    }
    r1.x = cmp(0 >= r2.y);
    if (r1.x != 0) {
      r1.w = 0;
    }
    if (r1.x == 0) {
      r1.x = r2.z / r2.y;
      r2.y = r2.y + -r1.z;
      r2.w = 0.0399999991 * r1.x;
      r2.w = 1 / r2.w;
      r2.z = -r2.z + -r2.x;
      r2.z = 0.0577078015 * r2.z;
      r2.z = exp2(r2.z);
      r1.x = -r1.z * r1.x + -r2.x;
      r1.x = 0.0577078015 * r1.x;
      r1.x = exp2(r1.x);
      r1.x = r2.z + -r1.x;
      r1.x = r2.w * r1.x + r2.y;
      r1.x = g_FogDesc.vFogLayerSettings.x * r1.x;
      r1.x = -1.44269502 * r1.x;
      r1.x = exp2(r1.x);
      r1.w = 1 + -r1.x;
    }
    r1.x = dot(g_FogDesc.vFogColor.xyz, float3(1,1,1));
    r1.x = cmp(0.00100000005 < r1.x);
    r1.z = log2(r0.w);
    r1.z = g_FogDesc.vDesc.x * r1.z;
    r1.z = exp2(r1.z);
    r2.xyz = g_FogDesc.vFogColor.xyz * r1.zzz;
    r2.xyz = log2(r2.xyz);
    r2.xyz = g_FogDesc.vFogColor.www * r2.xyz;
    r2.xyz = exp2(r2.xyz);
    r2.xyz = float3(-1.44269502,-1.44269502,-1.44269502) * r2.xyz;
    r2.xyz = exp2(r2.xyz);
    r2.xyz = float3(1,1,1) + -r2.xyz;
    r1.z = cmp(0.800000012 < r0.w);
    r1.x = r1.x ? r1.z : 0;
    if (r1.x != 0) {
      r0.w = -0.800000012 + r0.w;
      r0.w = 5 * r0.w;
      r3.xyz = float3(1,1,1) + -r2.xyz;
      r2.xyz = r0.www * r3.xyz + r2.xyz;
    }
    r0.w = -0.25 + g_FogDesc.vFogDistance.w;
    r0.w = r0.w + r0.w;
    r1.x = dot(r2.xyz, float3(0.333299994,0.333299994,0.333299994));
    r3.xyz = r1.xxx + -r2.xyz;
    r2.xyz = r0.www * r3.xyz + r2.xyz;
    r3.xy = w1.xy;
    r3.z = 0;
    r3.xyzw = g_tSky.SampleLevel(SkyLerpSampler_s, r3.xyz, 0).xyzw;
    r4.xy = w1.xy;
    r4.z = 1;
    r4.xyzw = g_tSky.SampleLevel(SkyLerpSampler_s, r4.xyz, 0).xyzw;
    r0.w = dot(r2.xyz, float3(0.333000004,0.333000004,0.333000004));
    r0.w = -0.300000012 + r0.w;
    r0.w = saturate(1.42857146 * r0.w);
    r3.xyzw = -r4.xyzw + r3.xyzw;
    r3.xyzw = r0.wwww * r3.xyzw + r4.xyzw;
    r2.xyz = saturate(r2.xyz);
    r0.w = cmp(g_FogDesc.vFogLayerSettings.w < 0.5);
    if (r0.w != 0) {
      r4.xyz = r3.xyz + -r0.xyz;
      r4.xyz = r2.xyz * r4.xyz + r0.xyz;
    }
    if (r0.w == 0) {
      r1.w = saturate(r1.w);
      r0.w = r3.w * r3.w;
      r5.xyz = g_FogDesc.vSunColor.xyz * r0.www + g_FogDesc.vAmbient.xyz;
      if (r1.y != 0) {
        r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
        r1.xyz = r1.www * r1.xyz + r0.xyz;
        r6.xyz = r3.xyz + -r1.xyz;
        r4.xyz = r2.xyz * r6.xyz + r1.xyz;
      } else {
        r0.w = g_FogDesc.vFogLayerSettings.z * -g_FogDesc.vFogLayerPlane.w;
        r0.w = min(1, r0.w);
        r1.x = cmp(r0.w < 0.999899983);
        if (r1.x != 0) {
          r0.w = r0.w * r0.w;
          r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
          r1.xyz = r1.www * r1.xyz + r0.xyz;
          r6.xyz = r3.xyz + -r1.xyz;
          r1.xyz = r2.xyz * r6.xyz + r1.xyz;
          r6.xyz = r3.xyz + -r0.xyz;
          r6.xyz = r2.xyz * r6.xyz + r0.xyz;
          r7.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r6.xyz;
          r6.xyz = r1.www * r7.xyz + r6.xyz;
          r6.xyz = r6.xyz + -r1.xyz;
          r4.xyz = r0.www * r6.xyz + r1.xyz;
        } else {
          r1.xyz = r3.xyz + -r0.xyz;
          r0.xyz = r2.xyz * r1.xyz + r0.xyz;
          r1.xyz = g_FogDesc.vFogLayerColor.xyz * r5.xyz + -r0.xyz;
          r4.xyz = r1.www * r1.xyz + r0.xyz;
        }
      }
    }
    o0.xyz = r4.xyz;
    o0.w = r4.w;
  }
  return;
}
